home *** CD-ROM | disk | FTP | other *** search
/ Celestin Apprentice 5 / Apprentice-Release5.iso / Source Code / Libraries / Sherlock 2.0 / Mac v2.0 docs / Text Docs / Mac Macros .txt < prev    next >
Text File  |  1996-04-05  |  12KB  |  440 lines

  1. Sherlock Macros
  2.  
  3. Overview
  4.  
  5. This chapter discusses all of Sherlock's macros.  Sherlock’s macros expand into actual code only 
  6. if SHERLOCK is defined.  The value assigned to the variable SHERLOCK does not matter, only 
  7. whether it is defined or not.  Define SHERLOCK before including "sl.h".  
  8.  
  9.  
  10. Most Sherlock macros define tracepoints.  Tracepoints are named locations within your program.  
  11. Tracepoints are either enabled or disabled.  On the Macintosh, you enabled or disable tracepoints 
  12. either from a simulated command line or from the Sherlock menu.  See the Chapter called 
  13. “Installing Sherlock” for full details.
  14.  
  15.  
  16. Most Sherlock macros are tracing macros: these macros contain executable statements, called 
  17. tracepoint actions, which are executed when control reaches the macro, but only if the macro's 
  18. tracepoint has been enabled.
  19.  
  20.  
  21. Tracepoint actions will often be tracing statements that print the values of various variables.  On 
  22. the Macintosh, Sherlock creates and maintains a special window, called the log window, to which 
  23. traces are sent using the es family of routines.  However, you can also use fprintf or any other 
  24. function to create traces.
  25.  
  26.  
  27. Besides tracing macros, Sherlock contains several special-purpose macros.  These macros do 
  28. tasks such as print or clear statistics, enable or disable watchpoints,  or enable or disable 
  29. tracepoints at run time.
  30.  
  31.  
  32. Macros such as STATB, TRACEPB and TICKB whose name ends in B denote entry macros. 
  33. These macros mark the start of timing sections.  Similarly, macros whose name ends in X denote 
  34. exit macros that mark the end of timing sections.
  35.  
  36.  
  37. Sherlock measures the time spent in all timing sections.  Timing sections may be nested; Sherlock 
  38. maintains a timing stack describing all timing sections currently being executed.  Each entry macro 
  39. must be paired with a corresponding exit macro with the same tracepoint name.  If an exit macro is 
  40. omitted, a timing stack overflow will eventually result.  If an extra exit macro is encountered, a 
  41. timing stack underflow may follow.  Sherlock prints a warning message and a stack traceback 
  42. when either an overflow or an underflow is detected.
  43.  
  44. Sherlock also counts the number of time each macro was executed.  These count statistics are 
  45. incremented even if a tracepoint is is disabled.  Macros whose name ends in N do not update count 
  46. statistics.
  47.  
  48.  
  49.  
  50. Tracepoint Names
  51.  
  52. Tracepoint names may contain lower case letters, numerals and the underscore character, but not 
  53. blanks or special characters such as ( ) { } + etc.  The following are valid tracepoint names:
  54.  
  55.  
  56.     STAT("rose");
  57.  
  58.     STAT("rose25");
  59.  
  60.  
  61. The following are invalid tracepoint names:
  62.  
  63.  
  64.     STAT("rose water");     // blank character
  65.  
  66.     STAT("wine&roses");    // & character
  67.  
  68.  
  69. Tracepoint names may start with a single minus sign.  This minus sign indicates that the tracepoint 
  70. name may only be enabled explicitly, not with a wildcard.  For instance, the following both define 
  71. the same tracepoint name, but tracing for the first statement must be enabled explicitly:
  72.  
  73.  
  74.     STAT("abc");    // may be enabled via wildcard such as ++a*
  75.  
  76.     STAT("-abc");    // may only be enabled with ++abc
  77.  
  78.  
  79.  
  80. The FTAG, FTAGV and SL_NAME macros
  81.  
  82. The FTAG and FTAGV macros defines variables called ftag, ftagv, while the SL_NAME macro 
  83. defines a variable whose name you supply:
  84.  
  85.  
  86.     #define FTAG(s)  char * ftag  = s
  87.  
  88.     #define FTAGV(s) char * ftagv = s
  89.  
  90.     #define SL_NAME(name, s) char * name = s
  91.  
  92.     
  93.  
  94. Use one of these macros to define a tracepoint name used by several macros.  This reduces the 
  95. number of strings used by Sherlock macros and also ensures that tracepoint names match.  The 
  96. next section shows how to use the FTAG macro.
  97.  
  98.  
  99.  
  100. The STAT, STATB and STATX macros
  101.  
  102. STAT takes one argument, a tracepoint name.  For example:
  103.  
  104.  
  105.     STAT("rose");
  106.  
  107.  
  108. STAT produces no output; its only function is to provide a label for a count statistic.
  109.  
  110.  
  111. The STATB is an entry macro that produces no output.  Similarly, the STATX macro is an exit 
  112. macro that produces no output.  For example, the following measures the time spent in a function:
  113.  
  114.  
  115.     int f()
  116.  
  117.     {
  118.  
  119.         FTAG("f");
  120.  
  121.         declarations;
  122.  
  123.         STATB(ftag);
  124.  
  125.         body of f;
  126.  
  127.         STATX(ftag);
  128.  
  129.     }
  130.  
  131.  
  132.  
  133. The TICK, TICKB, TICKN and TICKX macros
  134.  
  135. The TICK macro takes one argument, a tracepoint name.  Examples:
  136.  
  137.  
  138.     TICK(ftag);
  139.  
  140.     TICK("marigold");
  141.  
  142.  
  143. If enabled, TICK simply prints the name of the tracepoint followed by a colon.  The output created 
  144. from the second example above would look like:
  145.  
  146.  
  147.     marigold:
  148.  
  149.  
  150. TICK updates the count statistic associated with the tracepoint name.  TICKN is the same as TICK 
  151. except that it does not update the count statistic.
  152.  
  153.  
  154. The TICKB and TICKX macros are the corresponding entry and exit macros.  TICKB updates 
  155. count statistics; TICKX does not.
  156.  
  157.  
  158.  
  159. The TRACE, TRACEB, TRACEN and TRACEX macros
  160.  
  161. TRACE takes two arguments. The first is a tracepoint name.  The second is a list of tracepoint 
  162. actions, consisting of one or more C language statements or blocks.  Statements in the list of 
  163. tracepoint actions are separated by semicolons as usual.  For example:
  164.  
  165.  
  166.     TRACE(ftag, es("variable v = "); eint(v); enl());
  167.  
  168.  
  169. The tracepoint actions consist of three statements:
  170.  
  171.  
  172.     es("variable v = "); eint(v); enl();
  173.  
  174.  
  175. The tracepoint actions will be executed only if the string contained in the ftag variable has been 
  176. enabled.  Any number of C statements may appear in the list of tracepoint actions.  For example:
  177.  
  178.  
  179.     TRACE(ftag,
  180.  
  181.         struct s * p=f(arg);
  182.  
  183.         print_s(p); enl();
  184.  
  185.     );
  186.  
  187.  
  188. The tracepoint action consist of the following 3 statements:
  189.  
  190.  
  191.     struct s * p=f(arg);
  192.  
  193.     print_s(p); enl();
  194.  
  195.  
  196. You can write any C statements in the list of tracepoint actions except initializers containing curly 
  197. braces.  Tracepoint actions may even contain other macros. For example:
  198.  
  199.  
  200.     TRACE("abc"
  201.  
  202.         TRACE("xyz",
  203.  
  204.             es("abc and xyz both enabled\n")));
  205.  
  206.  
  207. The TRACEB, TRACEN and TRACEX macros work as you would expect:  the TRACEN macro 
  208. does not update count statistics, the TRACEB macro is an entry macro and the TRACEX macro is 
  209. an exit macro.
  210.  
  211.  
  212.  
  213.  
  214. The TRACEP, TRACEPB, TRACEPN and TRACEPX macros
  215.  
  216. The TRACEP macro works just like the TRACE macro except that TRACEP prints the name of 
  217. the tracepoint, a colon and a space before executing the tracepoint actions.  For example, the 
  218. following two macros are equivalent:
  219.  
  220.  
  221.     TRACE("daisy", es("daisy: n = "); eint(n); enl());
  222.  
  223.     TRACEP("daisy", es("n = "); eint(n); enl());
  224.  
  225.  
  226. Similarly, the  TRACEPB, TRACEPN, and TRACEPX macros works like the corresponding 
  227. TRACEB, TRACEN and TRACEX macros except that they print the name of the tracepoint before 
  228. executing their tracepoint actions.
  229.  
  230.  
  231. There are no macros names TRACEBP, TRACEXP, etc.  Think of TRACEP as a separate family 
  232. from TRACEP; the P is not a suffix than can be applied to any macro.
  233.  
  234.  
  235.  
  236. The SL_DUMP and SL_CLEAR macros
  237.  
  238. The SL_DUMP macro prints out a report of all statistics gathered so far.   It takes no arguments 
  239. and can be called at any time.  For example:
  240.  
  241.  
  242.     SL_DUMP();
  243.  
  244.  
  245. The report contains several columns. The tracepoints column is an alphabetized list of tracepoint 
  246. names, the ticks column gives count statistics for each tracepoint name, the times1 column gives 
  247. non-cumulative timing statistics, the times2 column gives cumulative timing statistics and the 
  248. tracing column indicates whether the tracepoint was enabled at the time SL_DUMP was called.
  249.  
  250.  
  251. The SL_CLEAR macro zeros all statistics.  The SL_INIT macro also does this, so normally there 
  252. is no need to use this macro.  You might use this macro to begin gathering statistics about a 
  253. selected portion of your code.  Call SL_CLEAR at the start of the section and SL_DUMP at the 
  254. end of the section.
  255.  
  256.  
  257.  
  258.  
  259. The SL_ON and SL_OFF macros
  260.  
  261. These macros enable or disable the tracing for a single tracepoint, just as if the name of the 
  262. tracepoint were appended to the end of the command line.  Wildcard characters and disable counts 
  263. are allowed.
  264.  
  265.  
  266. The name “trace” is a special case which enables or disables the tracing of all tracepoints.  
  267. SL_OFF( "trace") is faster than disabling tracing for all tracepoints using wildcards because 
  268. SL_OFF("trace") disables all tracing logic.  Examples:
  269.  
  270.  
  271.     SL_ON("abc");
  272.  
  273.     SL_OFF("*");
  274.  
  275.     SL_OFF("trace");    // enables all tracing logic
  276.  
  277.  
  278.  
  279. The SL_INIT and SL_PARSE macros
  280.  
  281. The SL_INIT macro should be executed before any other macro.  It initializes the Sherlock 
  282. system.  SL_INIT should also be called before the w_mac_init routine.  The SL_PARSE macro 
  283. reads an argv vector looking for Sherlock arguments.  Examples:
  284.  
  285.  
  286.     SL_INIT();
  287.  
  288.     SL_PARSE(argc, argv, "++", "--");
  289.  
  290.  
  291. The "++" and "--" arguments are the prefix strings used to distinguish Sherlock arguments from 
  292. other arguments.  See the Chapter called “Installing Sherlock” for full details.
  293.  
  294.  
  295.  
  296. The SL_WATCH macro
  297.  
  298. The SL_WATCH macro specifies the starting address and length of a block.  This block is checked 
  299. whenever a sherlock macro is executed and a messages is issued whenever the block changes.  
  300. This macro takes three arguments: the address of the first byte of the block, the length of the 
  301. block, and a string to print in the warning message.  For instance, the following watch macro 
  302. checks to see if any NULL pointer has been used to store data.
  303.  
  304.  
  305.     SL_WATCH((char *) 0, 4, "location zero");
  306.  
  307. The SL_DISABLE and SL_ENABLE macros
  308.  
  309. Use the SL_ENABLE and SL_DISABLE macros for greater control over SPP.  Neither macro 
  310. generates any code—they simply serve as markers for SPP.  SL_DISABLE causes SPP not to 
  311. generate macros for a function.  For example, 
  312.  
  313.  
  314.     int f(void)
  315.  
  316.     {
  317.  
  318.         declarations;
  319.  
  320.         SL_DISABLE();
  321.  
  322.         // SPP will not generate Sherlock macros in this function.
  323.  
  324.     }
  325.  
  326.  
  327. The FTAG macro also will cause SPP not to generate macros for a function:
  328.  
  329.  
  330.     int f(void)
  331.  
  332.     {
  333.  
  334.         FTAG("f");
  335.  
  336.         declarations;
  337.  
  338.         // SPP will not generate Sherlock macros in this function.
  339.  
  340.     }
  341.  
  342.  
  343. The SL_ENABLE macros forces SPP to insert macros into a function.  Use this macro when a 
  344. function starts with a Sherlock macro that you wrote yourself.  For example:
  345.  
  346.  
  347.     int g(void)
  348.  
  349.     {
  350.  
  351.         declarations;
  352.  
  353.         SL_ENABLE();
  354.  
  355.         TRACEP("dump", es("g = "); eint(g); enl());
  356.  
  357.         // SPP will generate Sherlock macros in this function.
  358.  
  359.     }
  360.  
  361. Summary of Sherlock macros
  362.  
  363.  
  364.     SL_INIT();            SL_PARSE(argc, argv, "++", "--");
  365.  
  366.  
  367. SL_INIT initializes the Sherlock system.  SL_PARSE enables or disables tracepoints.
  368.  
  369.  
  370.     FTAG(string);        FTAGV(string);
  371.  
  372.     SL_NAME(name, string);
  373.  
  374.  
  375. FTAG and FTAGV define a variables named ftag and ftagv initialized to the given string.
  376.  
  377. SL_NAME defines a variable with the given name initialized to the given string.
  378.  
  379.  
  380.     STAT(tracepoint);
  381.  
  382.     STATB(tracepoint);
  383.  
  384.     STATX(tracepoint);
  385.  
  386.  
  387. The STAT macros increment their count statistic but produce no output.
  388.  
  389.  
  390.     TICK(tracepoint);
  391.  
  392.     TICKB(tracepoint);
  393.  
  394.     TICKN(tracepoint);
  395.  
  396.     TICKX(tracepoint);
  397.  
  398.  
  399. The TICK macros print the name of the tracepoint.
  400.  
  401.  
  402.     TRACE(tracepoint,  statements);  TRACEP(tracepoint,  statements);
  403.  
  404.     TRACEB(tracepoint, statements);  TRACEPB(tracepoint, statements);
  405.  
  406.     TRACEN(tracepoint, statements);  TRACEPN(tracepoint, statements);
  407.  
  408.     TRACEX(tracepoint, statements);  TRACEPX(tracepoint, statements);
  409.  
  410.  
  411.  
  412. The TRACE macros execute their statements only if their tracepoints are enabled.  The TRACEP 
  413. macros print their tracepoint name and execute their statements only if their tracepoints are enabled.
  414.  
  415.  
  416.     SL_CLEAR();            SL_DUMP();
  417.  
  418.  
  419. SL_CLEAR clears all statistics.  SL_DUMP prints a report of all statistics.
  420.  
  421.  
  422.     SL_ON(tracepoint);    SL_OFF(tracepoint);
  423.  
  424.  
  425. SL_ON enables tracing for the tracepoint.  SL_OFF disables tracing for a single tracepoint.   
  426. SL_OFF("trace") disables all tracing.
  427.  
  428.  
  429.     SL_ENABLE();        SL_DISABLE();
  430.  
  431.  
  432. SL_DISABLE prevents SPP from generating macros.  SL_ENABLE forces SPP to generate 
  433. macros.
  434.  
  435.  
  436.     SL_WATCH(block, block, tag);
  437.  
  438.  
  439. SL_WATCH check the block on all Sherlock calls and reports when the block changes.
  440.